<template>
    <div class="switch-theme">
        <button
            @click="switchTheme()"
            :class="['vt-switch', 'vt-switch-appearance']"
            role="switch"
            type="button"
            aria-label="切换深色模式"
            :aria-checked="isLight">
            <span class="vt-switch-check"
                ><span class="vt-switch-icon"
                    ><svg
                        xmlns="http://www.w3.org/2000/svg"
                        aria-hidden="true"
                        focusable="false"
                        viewBox="0 0 24 24"
                        :class="'vt-switch-appearance-sun'">
                        <path
                            d="M12,18c-3.3,0-6-2.7-6-6s2.7-6,6-6s6,2.7,6,6S15.3,18,12,18zM12,8c-2.2,0-4,1.8-4,4c0,2.2,1.8,4,4,4c2.2,0,4-1.8,4-4C16,9.8,14.2,8,12,8z"></path>
                        <path d="M12,4c-0.6,0-1-0.4-1-1V1c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,3.6,12.6,4,12,4z"></path>
                        <path d="M12,24c-0.6,0-1-0.4-1-1v-2c0-0.6,0.4-1,1-1s1,0.4,1,1v2C13,23.6,12.6,24,12,24z"></path>
                        <path
                            d="M5.6,6.6c-0.3,0-0.5-0.1-0.7-0.3L3.5,4.9c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C6.2,6.5,5.9,6.6,5.6,6.6z"></path>
                        <path
                            d="M19.8,20.8c-0.3,0-0.5-0.1-0.7-0.3l-1.4-1.4c-0.4-0.4-0.4-1,0-1.4s1-0.4,1.4,0l1.4,1.4c0.4,0.4,0.4,1,0,1.4C20.3,20.7,20,20.8,19.8,20.8z"></path>
                        <path d="M3,13H1c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S3.6,13,3,13z"></path>
                        <path d="M23,13h-2c-0.6,0-1-0.4-1-1s0.4-1,1-1h2c0.6,0,1,0.4,1,1S23.6,13,23,13z"></path>
                        <path
                            d="M4.2,20.8c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C4.7,20.7,4.5,20.8,4.2,20.8z"></path>
                        <path
                            d="M18.4,6.6c-0.3,0-0.5-0.1-0.7-0.3c-0.4-0.4-0.4-1,0-1.4l1.4-1.4c0.4-0.4,1-0.4,1.4,0s0.4,1,0,1.4l-1.4,1.4C18.9,6.5,18.6,6.6,18.4,6.6z"></path>
                    </svg>
                    <svg
                        xmlns="http://www.w3.org/2000/svg"
                        aria-hidden="true"
                        focusable="false"
                        viewBox="0 0 24 24"
                        :class="'vt-switch-appearance-moon'">
                        <path
                            d="M12.1,22c-0.3,0-0.6,0-0.9,0c-5.5-0.5-9.5-5.4-9-10.9c0.4-4.8,4.2-8.6,9-9c0.4,0,0.8,0.2,1,0.5c0.2,0.3,0.2,0.8-0.1,1.1c-2,2.7-1.4,6.4,1.3,8.4c2.1,1.6,5,1.6,7.1,0c0.3-0.2,0.7-0.3,1.1-0.1c0.3,0.2,0.5,0.6,0.5,1c-0.2,2.7-1.5,5.1-3.6,6.8C16.6,21.2,14.4,22,12.1,22zM9.3,4.4c-2.9,1-5,3.6-5.2,6.8c-0.4,4.4,2.8,8.3,7.2,8.7c2.1,0.2,4.2-0.4,5.8-1.8c1.1-0.9,1.9-2.1,2.4-3.4c-2.5,0.9-5.3,0.5-7.5-1.1C9.2,11.4,8.1,7.7,9.3,4.4z"></path></svg></span
            ></span>
        </button>
    </div>
</template>

<script setup lang="ts">
/**
 * 浅色与深色主题切换
 * 1. 支持<html>添加类名和添加属性标识主题
 * 2. 主题选择结果将会持久化到 localstorage 中
 */

import { ref } from "vue";

const themeMedia = window.matchMedia("(prefers-color-scheme: light)");

// 以浏览器默认主题为网站主题
const browserDefaultTheme = themeMedia.matches ? "light" : "dark";
const curTheme = localStorage.getItem("theme") ?? browserDefaultTheme;

const isLight = ref(true);
isLight.value = curTheme === "light";

document.documentElement.setAttribute("data-theme", curTheme);
document.documentElement.classList.add(curTheme !== "light" ? "dark" : "light");

localStorage.setItem("theme", curTheme);

function switchTheme() {
    isLight.value = !isLight.value;

    const _targetTheme = localStorage.getItem("theme") === "light" ? "dark" : "light";
    localStorage.setItem("theme", _targetTheme);

    document.documentElement.setAttribute("data-theme", _targetTheme);

    if (_targetTheme === "dark") {
        document.documentElement.classList.add("dark");
        document.documentElement.classList.remove("light");
    } else {
        document.documentElement.classList.add("light");
        document.documentElement.classList.remove("dark");
    }
}
</script>

<style scoped lang="scss">
.switch-theme {
    .vt-switch {
        position: relative;
        display: block;
        flex-shrink: 0;
        width: 40px;
        height: 22px;
        cursor: pointer;
        background-color: #f1f1f1;
        border: 1px solid rgb(60 60 60 / 29%);
        border-radius: 11px;
        outline: none;
        transition:
            border-color 0.25s,
            background-color 0.25s;
        &:hover {
            border-color: rgb(84 84 84 / 65%);
        }
        .vt-switch-check {
            position: absolute;
            top: 1px;
            left: 1px;
            width: 18px;
            height: 18px;
            background-color: #ffffff;
            border-radius: 50%;
            box-shadow:
                0 1px 2px rgb(0 0 0 / 4%),
                0 1px 2px rgb(0 0 0 / 6%);
            transition:
                background-color 0.25s,
                transform 0.25s;
            .vt-switch-icon {
                position: relative;
                display: block;
                width: 18px;
                height: 18px;
                overflow: hidden;
                border-radius: 50%;
                transition: opacity 0.25s;
                svg {
                    position: absolute;
                    top: 3px;
                    left: 3px;
                    width: 12px;
                    height: 12px;
                    fill: rgb(60 60 60 / 70%);
                }
            }
        }
    }
    .vt-switch-appearance {
        .vt-switch-appearance-sun {
            opacity: 1;
        }
        .vt-switch-appearance-moon {
            opacity: 0;
        }
    }
}
html[data-theme="dark"],
html.dark {
    .vt-switch-appearance {
        background-color: #2f2f2f;
        &:hover {
            border-color: #8e8e8e;
        }
        .vt-switch-check {
            background-color: #000000;
            transform: translate(18px);
            .vt-switch-icon {
                .vt-switch-appearance-sun {
                    opacity: 0;
                }
                .vt-switch-appearance-moon {
                    opacity: 1;
                    fill: #ffffff;
                }
            }
        }
    }
}
</style>
